﻿#define _CRT_SECURE_NO_WARNINGS 1

//赋值运算符重载

//赋值运算符重载是⼀个默认成员函数，⽤于完成两个已经存在的对象直接的拷⻉赋值
//这⾥要注意跟拷⻉构造区分，拷⻉构造⽤于⼀个对象拷⻉初始化给另⼀个要创建的对象。

//赋值运算符的特点
//1、需要重载为成员函数 参数建议写为const当前类类型引用
//2、赋值操作有返回值 （因为需要支持连续赋值）
//3、默认赋值运算符对内置类型成员变量会完成浅拷贝,对⾃定义类型成员变量会调⽤他的赋值重载函数。
//4、如果⼀个类显⽰实现了析构并释放资源，那么他就需要显⽰写赋值运算符重载，否则就不需

#include <iostream>
using namespace std;

class Date
{
public:
	//构造函数
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	//不需要显式地写析构函数
	
	//拷贝构造函数
	Date(const Date& d)
	{
		cout << "Date(const Date& d)" << endl;
		this->_year = d._year;
		this->_month = d._month;
		this->_day = d._day;
	}

	int operator==(const Date& d)
	{
		return this->_year == d._year
			&& this->_month == d._month
			&& this->_day == d._day;
	}
	int operator!=(const Date& d)
	{
		return !(*this == d);
	}

	//赋值运算符重载函数
	Date& operator=(const Date& d) //返回引用类型 赋值后this指向的对象仍然存在 不会成为野引用
	{
		if (*this != d) //去掉自己给自己赋值
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
		return *this;
	}

	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1(2025, 1, 1);
	Date d2(2025, 1, 19);

	d1.Print();
	d2.Print();

	d2 = d1;
	d2.Print();

	Date d3;
	d3 = d2 = d1;
	d3.Print();
	d2.Print();
	d1.Print();
	return 0;
}